	<script type="text/javascript">
	function pasarVariables(pagina, nombres) {
  pagina +="?";
  nomVec = nombres.split(",");
  for (i=0; i<nomVec.length; i++)
    pagina += nomVec[i] + "=" + escape(eval(nomVec[i]))+"&";
  pagina = pagina.substring(0,pagina.length-1);
  location.href=pagina;
}
</script>
<div class="content clear-block">
	<h2>Cap&iacute;tulo 5 Configura servidor dedicado.</h2>
<br /><p class="definicion" align="justify">
&nbsp;&nbsp;Previamente tenemos que modificar algunos parametros en el fichero de inicializacion:
<br /><br />
a)	DISPATCHER: indica el n&uacute;mero de dispatchers que se van a ejecutar al iniciar la instancia. Se pueden a&ntilde;adir dispatchers de forma dinamica utilizando ALTER SYSTEM.
El parametro DISPATCHER se puede completar con algunos atributos:
</p>
<blockquote>
-- ADDRESS: indica la direccion donde el dispatcher esta escuchando.<br />
-- CONNECTIOS: m&aacute;ximo n&uacute;mero de conexiones por dispatcher.<br />
-- PROTOCOL: protocolo de comunicacion utilizado entre el dispatcher y el listener.<br />
-- SERVICE: nombre del servicio con el que el dispatcher se va a registrar con el listener.<br />
-- POOL: configura el dispatcher para gestionar de una forma m&aacute;s eficiente conexiones que se encuentrar inactivas. El valor ser&iacute;a ON. Junto con este parametro tambien tendriamos que configurar el parametro TICK donde cada unidad representa 10 minutos de inactividad.<br />
</blockquote>
<p class="definicion" align="justify">
Un ejemplo de este parametro ser&iacute;a:
</p>
<blockquote><i>DISPATCHER="(PROTOCOL=TCP)(DISPATCHER=2)" </i></blockquote>
<p class="definicion" align="justify">
o de forma din&aacute;mica:
</p>
<blockquote><i>ALTER SYSTEM SET DISPATCHERS="(PRO=TCP)(DIS=2)";</i></blockquote>
<p class="definicion" align="justify">
En el ejemplo se estan configurando dos dispatcher utilizando el protocolo TCP.
<br /><br />
&nbsp;&nbsp;Para calcular el numero de dispatcher que debemos arrancar en nuestro servidor debemos conocer el numer de conexiones maximas que nos limita nuestro sistema operativo y el numero de conexiones maximas que podemos encontrar en nuestra base de datos.
<br /><br />
La vista dinamica V$SESSION nos aporta informaci&oacute;n de las conexiones establecidas en nuestra base de datos.
</p>
<blockquote style="COLOR: #2e5348; FONT-SIZE: 12px; FONT-WEIGHT: bold FONT:Arial, Helvetica, sans-serif">
<pre><p>
SQL> select sid,serial#,username,server,program from v$session

SID        SERIAL#  USERNAME   SERVER     PROGRAM
--------- --------- ---------- --------- ---------------
7          13       SCOTT      DEDICATED SQLPLUS.EXE
8          12       SCOTT      DEDICATED SQLPLUS.EXE
9          4        SYSTEM     DEDICATED SQLPLUS.EXE
</p></pre></blockquote>
<p class="definicion" align="justify">
b)	SHARED_SERVERS: Indica el n&uacute;mero minimo de procesos de servidor que se van a arrancar con la instancia.
</p>
<blockquote><i>ALTER SYSTEM SET SHARED_SERVERS=3;</i></blockquote>
<p class="definicion" align="justify">
c)	SHARED_SERVERS_SESSIONS: Indica el n&uacute;mero m&aacute;ximo de sesiones que se van a aceptar. Si se sobrepasa este numero al siguiente intento de conexi&oacute;n se obtendra un ORA-00018.
</p><br />
<h3>GESTION SERVIDOR COMPARTIDO</h3>
<p class="definicion" align="justify">
La informacion de las conexiones establecidas y de la carga de los dispatcher nos la proporciona el listener:
</p>
<blockquote style="COLOR: #2e5348; FONT-SIZE: 12px; FONT-WEIGHT: bold FONT:Arial, Helvetica, sans-serif">
<pre><p>
c:\..\bin>lsnrctl services

LSNRCTL for 32-bit Windows: Version 10.1.0.2.0 - Production on 21-APR-2004
20:50:35
Copyright (c) 1991, 2004, Oracle. All rights reserved.
Connecting to (DESCRIPTION=(ADDRESS=(PROTOCOL=TCP)(HOST=MJW01)
(PORT=1521)))
Services Summary...
Service "PLSExtProc" has 1 instance(s).
Instance "PLSExtProc", status UNKNOWN, has 1 handler(s) for this service...
Handler(s):
"DEDICATED" established:0 refused:0
LOCAL SERVER
Instance "MJW", status READY, has 3 handler(s) for this service...
Handler(s):
"DEDICATED" established:0 refused:0 state:ready
LOCAL SERVER
"D001" established:11 refused:1 current:1 max:1002 state:ready
DISPATCHER machine: MJW01, pid: 504
(ADDRESS=(PROTOCOL=tcp)(HOST=MJW01)
(PORT=4152))
"D000" established:15 refused:3 current:2 max:1002 state:ready
DISPATCHER machine: MJW01, pid: 3846
(ADDRESS=(PROTOCOL=tcp)(HOST=MJW01)
(PORT=3845))
The command completed successfully
</p></pre></blockquote>
<p class="definicion" align="justify">
De este ejemplo podemos obtener que en esta instancia estan corriendo dos dispatcher donde D001 esta atendiendo una conexion y D000 esta atendiendo dos conexiones. Aparte aporta informaci&oacute;n del numero de conexiones que han sido rechazadas.
<br /><br />
Tambien podemos consultar algunas vistas din&aacute;micas que nos proporcionan informaci&oacute;n de los dispatcher que tenemos configurados en nuestra base de datos:
<br /><br />
- V$DISPATCHER
</p>
<blockquote style="COLOR: #2e5348; FONT-SIZE: 12px; FONT-WEIGHT: bold FONT:Arial, Helvetica, sans-serif">
<pre><p>
SQL> select name,status,messages,idle,busy,bytes,breaks from v$dispatcher

NAME STATUS MESSAGES  IDLE    BUSY BYTES BREAKS
---- ------ --------- ------- ---- ------ ------
D000 WAIT   168       389645  108  12435  0
D001 WAIT   94        389668  48   6940   0
</p></pre></blockquote>
<p class="definicion" align="justify">
Aporta informacion sobre el numero de dispatcher, el estado en el que se encuentran, WAIT indica que estan esperando nuevas conexiones IDLE y BUSY indican en centenares de segundos el tiempo que han pasado en ese estado. BYTES y MESSAGES indica el numero de bytes o mensajes procesados desde que se inicio la instancia.
<br /><br />
-V$DISPATCHER_CONFIG
</p>
<blockquote style="COLOR: #2e5348; FONT-SIZE: 12px; FONT-WEIGHT: bold FONT:Arial, Helvetica, sans-serif">
<pre><p>
SQL> select conf_indx,dispatchers,connections,sessions "SESS",service
2 from v$dispatcher_config
3 where network like '%TCP%'
CONF_INDX DISPATCHERS CONNECTIONS SESS   SERVICE
--------- ----------- ----------- ------ -------
0         3           1002        1002   orcl
</p></pre></blockquote>
<p class="definicion" align="justify">
Nos aporta informaci&oacute;n de la configuracion del listener.
<br /><br />
-V$DISPATCHER_RATE
</p>
<blockquote style="COLOR: #2e5348; FONT-SIZE: 12px; FONT-WEIGHT: bold FONT:Arial, Helvetica, sans-serif">
<pre><p>
SQL>select name,cur_event_rate,cur_msg_rate,
cur_svr_byte_rate
from v$dispatcher_rate
NAME CUR_EVENT_RATE CUR_MSG_RATE CUR_SVR_BYTE_RATE
---- -------------- ------------ -----------------
D000 5300           4            0  
D001 5205           3            0 
</p></pre></blockquote>
<p class="definicion" align="justify">
Aporta informacion estadistica de los dispatcher, por ejemplo CUR_EVENT_RATE indica el numero de peticiones por minuto (5,300 en D000 y 5,205 en D001). CUR_MSG_RATE muestra lo rapido que el dispatcher manda las peticiones del cliente al proceso servidor. Las unidades de CUR_EVENT_RATE son eventos por minuto, mientras que la de CUR_MSG_RATE son las de mensajes por segundo.
<br /><br />
-V$QUEUE
</p>
<blockquote style="COLOR: #2e5348; FONT-SIZE: 12px; FONT-WEIGHT: bold FONT:Arial, Helvetica, sans-serif">
<pre><p>
SQL> select * from v$queue;
PADDR    TYPE       QUEUED    WAIT      TOTALQ
-------- ---------- --------- --------- ---------
00       COMMON     0         0         152
03C6C244 DISPATCHER 0         0         91
03C6C534 DISPATCHER 0         0         71
</p></pre></blockquote>
<p class="definicion" align="justify">
Aporta informacion del estado de la cola de peticiones y de las colas de respuestas.
<br /><br />
-V$SHARED_SERVER
</p>
<blockquote style="COLOR: #2e5348; FONT-SIZE: 12px; FONT-WEIGHT: bold FONT:Arial, Helvetica, sans-serif">
<pre><p>
SQL> select name,status,messages,bytes,idle,busy,
requests from v$shared_server;
NAME STATUS MESSAGES BYTES IDLE BUSY REQUESTS
---- ------ -------- ----- ----- ---- --------
S000 EXEC   372      86939 98472 300  175
S001 EXEC   26       9851  98703 38   13
</p></pre></blockquote>
<p class="definicion" align="justify">
Aporta informacion del numero de peticiones procesadas y de la cantidad de bytes procesados por el servidor compartido. S001 y S000 son los servidores compartidos, EXEC significa que actualmente se encuentra procesando una peticion.
<br /><br />
En este ejemplo vemos que S000 ha procesado muchos mas mensajes que S001, esto es debido aque S000 esta el primero en la sita de servidores y unicamente mandaran un mensaje a S001 cuando S000 no pueda procesarlo.
</p>
<h3>PETICION DE UNA CONEXION DEDICADA EN UN SERVIDOR COMPARTIDO</h3>
<p class="definicion" align="justify">
Hemos comentado que las conexiones a traves de servidores compartidos no permiten ciertas tareas de administracion. Para poder realizar una conexion dedicada tendremos que modificar el tnsnames.ora del cliente:
</p>
<blockquote style="COLOR: #2e5348; FONT-SIZE: 12px; FONT-WEIGHT: bold FONT:Arial, Helvetica, sans-serif">
<pre><p>
# tnsnames.ora Network Configuration File:
# C:\oracle\product\10.1.0\db_1\network\admin\tnsnames.ora
ORCL =
(DESCRIPTION =
(ADDRESS = (PROTOCOL = TCP)(HOST = MJW01)(PORT = 1521))
(CONNECT_DATA =
(SERVICE_NAME = orcl)
(SRVR = DEDICATED) # Request a dedicated connection for DBA
)
)
</p></pre></blockquote>
<h3>CALCULAR EL NUMERO DE DISPATCHER NECESARIOS</h3>
<p class="definicion" align="justify">
Ejecutaremos esta query para saber el porcentaje del tiempo en el que el dispatcher esta ocupado:
</p>
<blockquote style="COLOR: #2e5348; FONT-SIZE: 12px; FONT-WEIGHT: bold FONT:Arial, Helvetica, sans-serif">
<pre><p>
Select name, (busy / (busy + idle))*100
"Dispatcher % busy Rate"
From V$DISPATCHER
Protocol Dispatcher % Busy Rate
------------        -------------
D000               .00070079
D001               .0059
</p></pre></blockquote>
<p class="definicion" align="justify">
Comprobamos que los dispatcher estan una porcentaje muy peque&ntilde;o de tiempo ocupados. Consideraremos que un dispatcher esta ocupado cuando este porcentaje supere el 50%. Entonces procederemos a a&ntilde;adir mas:
</p>
<blockquote><i>ALTER SYSTEM SET DISPATCHERS="(PRO=TCP)(DIS=4)";</i></blockquote>
<br />
<h3>COMPROBAR CUANTO TIEMPO ESTAN ESPERANDO LOS CLIENTES A SER ATENDIDOS.</h3>
<p class="definicion" align="justify">
Ejecutaremos esta query para saber el promedio en segundos que tiene que esperar un cliente a procesar su mensaje:
</p>
<blockquote style="COLOR: #2e5348; FONT-SIZE: 12px; FONT-WEIGHT: bold FONT:Arial, Helvetica, sans-serif">
<pre><p>
SELECT decode(sum(totalq),0,'No Responses',
Sum(wait)/sum(totalq)) "Average Wait time"
FROM V$QUEUE q, V$DISPATCHER d
WHERE q.type = 'DISPATCHER'
AND q.paddr = d.paddr;
Average Wait Time
------------------
.0413
</p></pre></blockquote>
<p class="definicion" align="justify">
El resultado indica que de media un cliente tiene que esperar 0.0413 segunos a ser atendido.
</p>
<h3>CALCULAR SI TENEMOS SUFICIENTES PROCESOS SERVIDOR.</h3>
<p class="definicion" align="justify">
Para saber esto vamos a calcular cuanto tiempo se invierte en procesar una peticion de un cliente:
</p>
<blockquote style="COLOR: #2e5348; FONT-SIZE: 12px; FONT-WEIGHT: bold FONT:Arial, Helvetica, sans-serif">
<pre><p>
Select decode(totalq,0,'No Requests') "Wait Time",
Wait/totalq || 'hundredths of seconds'
"Average Wait time per request"
from V$QUEUE
where type = 'COMMON'
Wait Time Average Wait time per request
-------- -----------------------------------
.023132 hundredths of a second.
</p></pre></blockquote>

</div>
